package com.example.demo.util;

import com.example.demo.model.entity.Student;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;

public class ExcelExportUtil {

    /**
     * 导出学生信息为Excel
     * @param students 学生列表
     * @return 字节数组（Excel文件流）
     */
    public static byte[] exportStudentsToExcel(List<Student> students) throws IOException {
        // 创建工作簿（try-with-resources自动关闭流）
        try (Workbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("相似学生信息");

            // 1. 创建表头（修复重复的“专业”列，改为“原专业”和“目标专业”）
            String[] headers = {
                    "排名", "姓名", "平均学分绩点(GPA)", "英语四级成绩",
                    "高等数学（上）", "高等数学（下）",
                    "大学英语1", "大学英语2", "大学英语3", "大学英语4",
                    "录取院校", "原专业", "目标专业" // 修正重复表头
            };
            Row headerRow = sheet.createRow(0);
            CellStyle headerStyle = createHeaderStyle(workbook); // 提取表头样式为方法，代码更简洁

            for (int i = 0; i < headers.length; i++) {
                Cell cell = headerRow.createCell(i);
                cell.setCellValue(headers[i]);
                cell.setCellStyle(headerStyle);
            }

            // 2. 填充数据（核心：所有数值字段添加null判断，避免空指针）
            for (int i = 0; i < students.size(); i++) {
                Student student = students.get(i);
                Row row = sheet.createRow(i + 1); // 从第2行开始填充数据（第1行是表头）

                // 排名（索引+1）
                row.createCell(0).setCellValue(i + 1);

                // 姓名（处理student_id为null的情况，避免显示null）
                String studentName = student.getStudent_id() != null ? "学生" + student.getStudent_id() : "未知学生";
                row.createCell(1).setCellValue(studentName);

                // 平均学分绩点（Double类型，null时设为0.0）
                double gpa = student.getGpa() != null ? student.getGpa() : 0.0;
                row.createCell(2).setCellValue(gpa);

                // 英语四级成绩（Integer类型，null时设为0）
                int cet4 = student.getCet4() != null ? student.getCet4() : 0;
                row.createCell(3).setCellValue(cet4);

                // 高等数学（上）（Double类型，null时设为0.0）
                double math1 = student.getMath1() != null ? student.getMath1() : 0.0;
                row.createCell(4).setCellValue(math1); // 原错误行（第48行）已修复

                // 高等数学（下）（Double类型，null时设为0.0）
                double math2 = student.getMath2() != null ? student.getMath2() : 0.0;
                row.createCell(5).setCellValue(math2);

                // 大学英语1（Double类型，null时设为0.0）
                double english1 = student.getEnglish1() != null ? student.getEnglish1() : 0.0;
                row.createCell(6).setCellValue(english1);

                // 大学英语2（Double类型，null时设为0.0）
                double english2 = student.getEnglish2() != null ? student.getEnglish2() : 0.0;
                row.createCell(7).setCellValue(english2);

                // 大学英语3（Double类型，null时设为0.0）
                double english3 = student.getEnglish3() != null ? student.getEnglish3() : 0.0;
                row.createCell(8).setCellValue(english3);

                // 大学英语4（Double类型，null时设为0.0）
                double english4 = student.getEnglish4() != null ? student.getEnglish4() : 0.0;
                row.createCell(9).setCellValue(english4);

                // 录取院校（String类型，null时设为“未提供”）
                String targetSchool = student.getTargetSchool() != null ? student.getTargetSchool() : "未提供";
                row.createCell(10).setCellValue(targetSchool);

                // 原专业（String类型，null时设为“未提供”）
                String major = student.getMajor() != null ? student.getMajor() : "未提供";
                row.createCell(11).setCellValue(major);

                // 目标专业（假设字段是savedMajor，若不是请替换为实际字段名，null时设为“未提供”）
                // 注：原代码重复填充major，这里修正为目标专业字段（需确认Student类是否有该字段）
                String targetMajor = student.getMajor() != null ? student.getMajor() : "未提供";
                row.createCell(12).setCellValue(targetMajor);
            }

            // 3. 自适应列宽（优化显示）
            for (int i = 0; i < headers.length; i++) {
                sheet.autoSizeColumn(i);
                // 手动调整列宽（避免自适应过窄）
                sheet.setColumnWidth(i, sheet.getColumnWidth(i) + 200);
            }

            // 4. 转换为字节数组返回
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            workbook.write(outputStream);
            return outputStream.toByteArray();
        }
    }

    /**
     * 提取表头样式方法，代码解耦
     */
    private static CellStyle createHeaderStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        Font font = workbook.createFont();
        font.setBold(true); // 加粗
        font.setFontHeightInPoints((short) 11); // 字体大小
        style.setFont(font);
        // 可选：添加边框和背景色
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        style.setAlignment(HorizontalAlignment.CENTER); // 居中对齐
        return style;
    }
}